﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LOGIC
{
    /// Logisk klass för hantering av utrustning
    public class LogicEquipment
    {
        private DB.Utrustning equipment;
        private DB.UtrustningsPri equipmentPrice;
        
        public LogicEquipment()
        {
        }

        private LogicEquipment(DB.Utrustning equipmentObject)
        {
            this.equipment = equipmentObject;
        }

        private LogicEquipment(DB.UtrustningsPri EquipmentObject)
        {
            this.equipmentPrice = EquipmentObject;
        }

        private LogicSession session;
        public LogicEquipment(LogicSession session)
        {
            this.session = session;
        }

        /// Get Metoder
        #region

        public string GetEquipmentId
        {
            get { return equipment.utrustningsID; }
        }

        public string GetEquipmentType
        {
            get { return equipment.utrustningsTyp; }
        }

        public string EquipmentPeriod
        {
            get { return equipmentPrice.antalDagar; }
        }

        public int EquipmentPrice
        {
            get { return (int)equipmentPrice.pris; }
        }

        #endregion

        /// <summary>
        /// Returnerar metod som hämtar utrustningspris efter ID nummer och period
        /// </summary>
        /// <param name="tempEquipT"></param>
        /// <param name="tempPeriod"></param>
        /// <returns></returns>
        public LogicEquipment GetEquipmentPrice(string tempEquipT, string tempPeriod)
        {
            return new LogicEquipment(LogicSession.TheSession.Db.GetEquipmentPrice(tempEquipT, tempPeriod));
        }

        /// <summary>
        /// Returnerar metod som hämtar utrustning efter ID nummer
        /// </summary>
        /// <param name="tempId"></param>
        /// <returns></returns>
        public List<string> GetEqById(string tempId)
        {
            return LogicSession.TheSession.Db.GetEqById(tempId);
        }

        /// <summary>
        /// Returnerar metod som hämtar vald utrustningstyp
        /// </summary>
        /// <param name="tempType"></param>
        /// <returns></returns>
        public IQueryable GetEquipment(string tempType)
        {
            return LogicSession.TheSession.Db.GetEquipment(tempType);
        }

        /// <summary>
        /// Returnerar metod som hämtar utrustningspris efter ID nummer och antal dagar
        /// </summary>
        /// <param name="tempId"></param>
        /// <param name="nrDays"></param>
        /// <returns></returns>
        public List<string> AddEqToSum(string tempId, string nrDays)
        {
            return LogicSession.TheSession.Db.GetEqPriceById(tempId, nrDays);
        }

        /// <summary>
        /// Returnerar metod som hämtar paketpris efter typ och antal dagar 
        /// </summary>
        /// <param name="temp"></param>
        /// <param name="nrDays"></param>
        /// <returns></returns>
        public List<string> AddPackToSum(string temp, string nrDays)
        {
            return LogicSession.TheSession.Db.GetEqPriceByPack(ConvertIdToPack(temp), nrDays);
        }

        /// <summary>
        /// Metod som returnerar priset av stavar för valt antal dagar
        /// </summary>
        /// <param name="nrDays"></param>
        /// <returns></returns>
        public int AddSticksToSum(string nrDays)
        {
            int tempDays = int.Parse(nrDays);
            int tempPrice = 0;

            switch (tempDays)
            {
                case 1: tempPrice = 40;
                    break;
                case 2: tempPrice = 50;
                    break;
                case 3: tempPrice = 60;
                    break;
                case 4: tempPrice = 70;
                    break;
                default: tempPrice = 80; // För resterande dagar, 5-7
                    break;
            }

            return tempPrice;
        }

        /// <summary>
        /// Returnerar metod som kollar om vald utrustning (ID nummer) finns lagrad i databasen
        /// </summary>
        /// <param name="tempId"></param>
        /// <returns></returns>
        public bool CheckEqInputById(string tempId)
        {
            return LogicSession.TheSession.Db.CheckEqInputById(tempId);
        }

        /// <summary>
        /// Metod för att kolla om vald utrustning tillhör ett paket
        /// </summary>
        /// <param name="equip"></param>
        /// <param name="feet"></param>
        /// <returns></returns>
        public bool CheckEqPack(string equip, string feet)
        {
            equip = equip.ToUpper();
            feet = feet.ToUpper();

            if ((equip[0] == feet[0]) && // Börjar på samma bokstav
                (equip.StartsWith("AS") || equip.StartsWith("LS") || equip.StartsWith("SB")) &&
                    (feet.StartsWith("AP") || feet.StartsWith("LP") || feet.StartsWith("SS")))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Metod för att kolla att skoter inte felaktigt hyrs ut i två eller fyra dagar
        /// </summary>
        /// <param name="tempId"></param>
        /// <param name="nrDays"></param>
        /// <returns></returns>
        public bool CheckEqScooter(string tempId, string nrDays)
        {
            tempId = tempId.ToUpper();

            if ((tempId.StartsWith("SK") &&
                (nrDays.StartsWith("2") || nrDays.StartsWith("4"))))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Metod som kollar att samma utrustning inte hyrs ut två gånger samtidigt
        /// </summary>
        /// <param name="tempId"></param>
        /// <param name="reserved"></param>
        /// <returns></returns>
        public bool CheckIfEqExists(string tempId, string[] reserved)
        {
            bool temp = true;
            string[] resSplit;
            tempId = tempId.ToUpper();

            for (int i = 0; i < reserved.Length; i++)
            {
                resSplit = reserved[i].Split('(', ')', ' ');
                if (resSplit[4] == tempId) // Om ID är samma som något i listan, returnera false
                {
                    temp = false;
                }
            }

            return temp;
        }

        /// <summary>
        /// Metod för att omvandla ID till paket
        /// </summary>
        /// <param name="temp"></param>
        /// <returns></returns>
        public string ConvertIdToPack(string temp)
        {
            temp = temp.ToUpper();
            List<string> types = LogicSession.TheSession.Db.GetEquipmentTypes(); // Hämtar samtliga utrustningstyper

            for (int i = 0; i < types.Count; i++)
            {
                if (temp[0] == types[i][0] && types[i].Contains("Paket")) // Kollar att det är rätt typ och paket
                {
                    temp = types[i];
                }
            }

            return temp;
        }

        /// <summary>
        /// Metod för att ändra utrustningstypspris
        /// </summary>
        /// <param name="tempId"></param>
        /// <param name="tempPeriod"></param>
        /// <param name="tempPrice"></param>
        public static void ChangedEquipPrice(string tempId, string tempPeriod, int tempPrice)
        {
            LogicSession.TheSession.Db.ChangedEquipPrice(tempId, tempPeriod, tempPrice);
        }
    }
}
